package persistencia;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import modelo.datos.Direccion;
import modelo.datos.Empresa;
import modelo.datos.Entrada;
import modelo.datos.Persona;
import modelo.datos.Telefono;
import modelo.datos.utils.ListaEntradas;
import es.uji.www.GeneradorDatosINE;

public class BaseDatosGestorImpl implements BaseDatos {
    private static final int NUMERO_ENTRADAS = 3;
    private EntityManagerFactory emf;
    private EntityManager em;
    private EntityTransaction tx;

    public BaseDatosGestorImpl() {
	super();
	emf = Persistence.createEntityManagerFactory("ejemplo");
	em = emf.createEntityManager();
	tx = em.getTransaction();
	iniciaDatos();
    }

    private void iniciaDatos() {
	String nombre;
	String apellidos;
	String nif;
	String poblacion;
	String provincia;
	GeneradorDatosINE generador = new GeneradorDatosINE();
	List<Telefono> telefonos = new ArrayList<>();
	Telefono telefono = new Telefono((short) 964, 555555);
	telefonos.add(telefono);
	tx.begin();
	em.persist(new Persona("Oscar", "Belmonte", "123", new Direccion(
		"Castellón", "Castellón de la Plana"), telefonos));
	telefonos = new ArrayList<>();
	telefono = new Telefono((short) 964, 444444);
	em.persist(new Empresa("UJI", "321", new Direccion("Castellón",
		"Castellón de la Plana"), telefonos));
	for (int i = 0; i < NUMERO_ENTRADAS; i++) {
	    nombre = generador.getNombre();
	    apellidos = generador.getApellido() + " " + generador.getApellido();
	    nif = generador.getNIF();
	    provincia = generador.getProvincia();
	    poblacion = generador.getPoblacion(provincia);
	    telefonos = new ArrayList<>();
	    telefono = new Telefono((short) (Math.random() * 100),
		    (int) (Math.random() * 1000000));
	    telefonos.add(telefono);
	    em.persist(new Persona(nombre, apellidos, nif, new Direccion(
		    provincia, poblacion), telefonos));
	    nombre = generador.getNombre();
	    nif = generador.getNIF();
	    provincia = generador.getProvincia();
	    poblacion = generador.getPoblacion(provincia);
	    telefonos = new ArrayList<>();
	    telefono = new Telefono((short) (Math.random() * 100),
		    (int) (Math.random() * 1000000));
	    telefonos.add(telefono);
	    telefono = new Telefono((short) (Math.random() * 100),
		    (int) (Math.random() * 1000000));
	    telefonos.add(telefono);
	    em.persist(new Empresa(nombre, nif, new Direccion(provincia,
		    poblacion), telefonos));
	}
	tx.commit();
    }

    @SuppressWarnings("unchecked")
    public ListaEntradas getEntradas() {
	Query query = em.createNamedQuery(Entrada.RECUPERA_TODAS);
	List<Entrada> entradas = query.getResultList();
	return new ListaEntradas(entradas);
    }

    @SuppressWarnings("unchecked")
    public Entrada buscaEntradaPorNIF(String nif) {
	Query query = em.createNamedQuery(Entrada.RECUPERA_POR_NIF);
	query.setParameter("nif", nif);
	List<Entrada> entradas = query.getResultList();
	if (entradas.isEmpty() == false)
	    return entradas.get(0);
	else
	    return BaseDatos.ENTRADA_NULL;
    }

    @Override
    public void nuevaEntrada(Entrada entrada) {
	tx.begin();
	em.persist(entrada);
	tx.commit();
    }

    @Override
    public boolean actualizaEntrada(Entrada entrada) {
	// TODO Auto-generated method stub
	return false;
    }

    @Override
    public boolean borraEntrada(String nif) {
	// TODO Auto-generated method stub
	return false;
    }

    @Override
    public Date getUltimaModificacion() {
	// TODO Auto-generated method stub
	return null;
    }

}
